﻿# -*- coding:utf-8 -*-
# 
#  импорт авторов и предметов из XML
#
import os, datetime, shutil
from xml.dom.minidom import *

from collections import defaultdict
from optparse import make_option
from django.core.management.base import BaseCommand, CommandError, AppCommand, NoArgsCommand
from django.db.models.loading import get_app, get_model
from django.conf import settings

#BASE_XML_DIR = 'D:/python/echoXMLbackup/'
#AUTHORS_XML_DIR = '' 
#ITEMS_XML_DIR = '' 
#IMAGE_DIR = ''


def toString(string):
    if type(string) == type(u''):
        string = string.encode(ENCODING)
    return string


def getText(nodelist):
    rc = ""
    for node in nodelist:
        if node.nodeType == node.TEXT_NODE:
            rc = rc + node.data
    return rc

def getTextByTagName(dom, tagname):
    return getText(dom.getElementsByTagName(tagname)[0].childNodes)


def getAuthorFromXML(filename):
    dom = parse(filename)
    Author = get_model('echo', 'Author')
    author = Author(
        id = int(getTextByTagName(dom,"id")),
        first_name = getTextByTagName(dom,"firstname") ,
        middle_name = getTextByTagName(dom,"middlename"),
        surname = getTextByTagName(dom,"lastname"),
        bio = getText(dom.getElementsByTagName("description")[0].childNodes[1].childNodes),
        person_photo = u"files/echo/img/op%s.jpg" % int(getTextByTagName(dom,"id")),
        #xml_file = ,
        saved_ftp = True,
        )    
    #print getText(dom.getElementsByTagName("description")[0].childNodes[1].childNodes)
    return author


def getListDir(path):
    path = toString(path)
    filelist = []
    for f in os.listdir(path):
        f = toString(f)
        if os.path.isdir(os.path.join(path, f)):
            pass
        else:
            filelist.append(os.path.join(path, f))
        filelist.sort()
    return filelist


def getItemFromXML(filename):
    dom = parse(filename)
    Item = get_model('echo', 'Item')
    Author = get_model('echo', 'Author')
    date_dict = dict(dom.getElementsByTagName("date")[0].attributes.items())
    item_date = datetime.datetime(
        int(date_dict['year']),
        int(date_dict['month']),
        int(date_dict['day']),
        int(date_dict['hours']),
        int(date_dict['minutes'])
        )    
    author_id =  dict(dom.getElementsByTagName("author")[0].attributes.items())['id']
    item = Item(
        id = int(getTextByTagName(dom,"id")),
        author = Author.objects.get(id=author_id),
        item_title = getTextByTagName(dom,"title"),
        item_fulltitle = getTextByTagName(dom,"fulltitle"),
        description = getText(dom.getElementsByTagName("description")[0].childNodes[1].childNodes),
        item_photo = u"files/echo/img/oi%s.jpg" % int(getTextByTagName(dom,"id")),
        publ_date = item_date, 
        #xml_file =
        saved_ftp = True,
        )
    return item


class Command(BaseCommand):
    AUTHORS_XML_DIR = '' 
    ITEMS_XML_DIR = '' 
    IMAGE_DIR = ''
    help = u'Импорт авторов и предметов из XML'
    requires_model_validation = True
    def handle(self, *args, **options):
        if len(args) != 1:
            raise CommandError('Required one argument -- path to the base directory containing the images and XML.')
        base_dir = args[0]
        self.AUTHORS_XML_DIR = '%sauthors/' % base_dir
        self.ITEMS_XML_DIR = '%sitems/' % base_dir 
        self.IMAGE_DIR = '%simages/' % base_dir
        # проверки путей
        if os.path.isdir(base_dir):
            if not os.path.isdir(self.AUTHORS_XML_DIR):
                raise CommandError('Invalid structure in "%s". Directory authors/ missing' %  base_dir)
            if not os.path.isdir(self.ITEMS_XML_DIR):
                raise CommandError('Invalid structure in "%s". Directory items/ missing' %  base_dir)
            if not os.path.isdir(self.IMAGE_DIR):             
                raise CommandError('Invalid structure in "%s". Directory images/ missing' %  base_dir)          
        else:
            raise CommandError('Base directory "%s" missing.' %  base_dir)
        #    
        from django.db.models import get_models
        # Выполнение всех операций в одной транзакции
        from django.db import transaction
        transaction.enter_transaction_management()
        try:
            transaction.managed(True)
            self.import_echo_data()
            self.set_default_variables()
            transaction.commit()
            print u"Импорт завершен успешно."
        except: 
            print u'Во время импорта были ошибки!'            
        finally:
            transaction.rollback()
            transaction.leave_transaction_management()  


    def import_echo_data(self):    
        print u"Импорт авторов из XML..."
        User = get_model('auth', 'User')
        filelist = getListDir(self.AUTHORS_XML_DIR)
        for file in filelist:
            print file;
            # импорт авторов из XML 
            author = getAuthorFromXML(file)
            user = User.objects.get(id=1)
            author.user = user 
            author.save()
            # копирование фото автора
            src = u"%sp%s.jpg" % (self.IMAGE_DIR,author.id)
            dst = u"%sop%s.jpg" % (settings.ECHO_IMAGE_PATH,author.id)
            try:
                shutil.copy(src,dst) 
            except:
                print u'Ошибка копирования %s' % src
                print u'                   %s' % dst
           
        print u"Импорт предметов из XML..."
        filelist = getListDir(self.ITEMS_XML_DIR)
        for file in filelist:
            print file;
            # импорт предметов
            item = getItemFromXML(file)
            user = User.objects.get(id=1) 
            item.user = user
            item.save()
            # копирование изображения предмета
            src = u"%si%s.jpg" % (self.IMAGE_DIR,item.id)
            dst = u"%soi%s.jpg" % (settings.ECHO_IMAGE_PATH,item.id)  
            try:
                shutil.copy(src,dst) 
            except:
                print u'Ошибка копирования %s' % src
                print u'                   %s' % dst
           

    def set_default_variables(self):
        ''' Запись значений по умолчанию в переменные '''
        print u"Инициализация переменных значениями по умолчанию..."
        Variables = get_model('echo', 'Variables')
        
        variables = Variables(name="ftp_user", value="ftp_user", description="Пользователь FTP")
        variables.save()
        variables = Variables(name="ftp_pass", value="123", description="Пароль пользователя FTP")
        variables.save()
        variables = Variables(name="ftp_host", value="192.168.1.14", description="Адрес сервера FTP")
        variables.save()
        variables = Variables(name="ftp_item_dir", value="/test/items", description="Директория изображений")
        variables.save()
        variables = Variables(name="ftp_author_dir", value="/test/authors", description="Директория файлов авторов")
        variables.save()
        variables = Variables(name="ftp_image_dir", value="/test/images", description="Директория файлов предметов")
        variables.save()   
     



